package com.ebelter.btlibrary.helper;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 线程池工具类
 * Created by Sergio Pan on 2017/11/11.
 */

public class BtThreadPool {

    private static ExecutorService cachedService;
    private static ExecutorService fixedService;
    private static ScheduledExecutorService scheduledService;

    //创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。示例代
    //线程池为无限大，当执行第二个任务时第一个任务已经完成，会复用执行第一个任务的线程，而不用每次新建线程。
    //    开的线程数太大，不建议使用
    public static void addCachedThreadPoll(Runnable thread) {
        if (cachedService == null) {
            cachedService = Executors.newCachedThreadPool();
        }
        cachedService.execute(thread);
    }

    //  创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。示例代码如下：
    //定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()
    public static void addFixedThreadPoll(Runnable thread) {
        if (fixedService == null) {
            fixedService = Executors.newFixedThreadPool(5);
        }
        fixedService.execute(thread);
    }

    //表示延迟1秒后每3秒执行一次。
    //创建一个定长线程池，支持定时及周期性任务执行。延迟执行示例代码如下：
    public static void addScheduledThreadPoll(Runnable thread, int startTime, int endTime) {
        if(scheduledService==null){
            scheduledService = Executors.newScheduledThreadPool(5);
        }
        scheduledService.scheduleAtFixedRate(thread, startTime, endTime, TimeUnit.SECONDS);
    }
}
